package zpe.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import zpe.controledeacesso.util.UsuarioUtil;
import zpe.genericcrud.service.GenericService;
import zpe.model.Carga;
import zpe.model.Cliente;
import zpe.model.ItemCarga;
import zpe.model.NomeclaturaNCM;
import zpe.model.NomeclaturasCarga;
import zpe.model.TransportadoraCarga;
import zpe.model.enums.Acondicionamento;
import zpe.model.enums.StatusCarga;

@Service(value="cargaService")
public class CargaService extends GenericService<Carga> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Autowired ClienteService serviceCliente;
	
	@Autowired NomeclaturaNCMService serviceNomeclatura;
	
	@Autowired TransportadoraCargaService serviceTransportadoraCarga;
	
	@Autowired NomeclaturasCargaService serviceNomeclaturasCarga;
	
	
	public NomeclaturasCargaService getServiceNomeclaturasCarga() {
		return serviceNomeclaturasCarga;
	}


	public void setServiceNomeclaturasCarga(
			NomeclaturasCargaService serviceNomeclaturasCarga) {
		this.serviceNomeclaturasCarga = serviceNomeclaturasCarga;
	}


	public TransportadoraCargaService getServiceTransportadoraCarga() {
		return serviceTransportadoraCarga;
	}


	public void setServiceTransportadoraCarga(
			TransportadoraCargaService serviceTransportadoraCarga) {
		this.serviceTransportadoraCarga = serviceTransportadoraCarga;
	}


	public List<NomeclaturaNCM> findNomeclaturas(NomeclaturaNCM nomeclatura) {
		
		List<NomeclaturaNCM> nomeclaturas = null;
		
		if(! "".equalsIgnoreCase( nomeclatura.getDescricao() ) ){

			nomeclaturas = serviceNomeclatura.findNomeclaturas(nomeclatura);
			
		}
		
		return nomeclaturas;
	}

	
	public NomeclaturaNCMService getServiceNomeclatura() {
		return serviceNomeclatura;
	}

	public void setServiceNomeclatura(NomeclaturaNCMService serviceNomeclatura) {
		this.serviceNomeclatura = serviceNomeclatura;
	}

	public ClienteService getServiceCliente() {
		return serviceCliente;
	}

	public void setServiceCliente(ClienteService serviceCliente) {
		this.serviceCliente = serviceCliente;
	}

	
	@Transactional( propagation = Propagation.REQUIRED, rollbackFor = RuntimeException.class )
	public Carga prepareCarga(Carga carga, List<Cliente> clientes, List<NomeclaturaNCM> nomeclaturas){
				
		if(!CollectionUtils.isEmpty(clientes)){
			
			TransportadoraCarga t;
			
			List<TransportadoraCarga> transportadoras = new ArrayList<TransportadoraCarga>(0);
			
			for (Cliente c : clientes) {
				t = new TransportadoraCarga();
				t.setCarga(carga);
				t.setCliente(c);
				transportadoras.add(t);
			}
			
			carga.setTransportadoras(transportadoras);
			carga.setStatus(StatusCarga.ATIVO);
			
		}
		

		if(!CollectionUtils.isEmpty(nomeclaturas)){
			
			NomeclaturasCarga nc;
			
			List<NomeclaturasCarga> listaNomeclaturas = new ArrayList<NomeclaturasCarga>(0);
			
			for (NomeclaturaNCM n : nomeclaturas) {
				nc = new NomeclaturasCarga();
				nc.setCarga(carga);
				nc.setNomeclatura(n);
				listaNomeclaturas.add(nc);
			}
			
			carga.setNomeclaturas(listaNomeclaturas);
			
		}

		if( carga.getAcondicionamento() != Acondicionamento.CONTEINER ) {
			
			carga.setItens( new ArrayList<ItemCarga>(0) );
			
		}
		
		carga.getAdmissaoRegime().setCarga(carga);

		carga.setUsuarioCadastro(UsuarioUtil.getUsuarioLogado());

		carga.setDataCadastro(new Date());

		return carga;
	}
	
	@Transactional( propagation = Propagation.REQUIRED, rollbackFor = RuntimeException.class )
	public void salvarCarga(Carga carga, List<Cliente> clientes, List<NomeclaturaNCM> nomeclaturas, List<NomeclaturaNCM> nomeclaturasRemovidas){
		
		prepareCarga(carga, clientes,nomeclaturas);
		
		getDao().getEntityManager().save(carga);
		
	}

	@Transactional( propagation = Propagation.REQUIRED, rollbackFor = RuntimeException.class )
	public void deletarCarga(List<Carga> cargas) {
		
		for (Carga carga : cargas) {
			carga.setAtivo('N');
			carga.setDataAlteracao(new Date());
			carga.setUsuarioAlteracao(UsuarioUtil.getUsuarioLogado());
		}
		
		updateAll(cargas);
	}
}
